51单片机读取DS18B20温度传感器 |
您所在的位置:网站首页 › 18b20 引脚 › 51单片机读取DS18B20温度传感器 |
1.首先我们知道DS18B20是单总线协议,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。 图一(截取DS18B20芯片手册) 2.初始化DS18B20 看图二可知,首先我们将总线从高拉低,保持480us左右,然后释放总线(没人拉低,默认高电平),此时总线上为高电平。然后等待15-60us,等待DS18B20模块将总线拉低。(如果拉低则说明DS18B20响应成功),DS18B20拉低60-240us后,释放总线。初始化完成。 图二 3.向DS18B20写入数据。 3.1 向DS18B20写0。 首先将总线由高拉低,低电平保持15us到60us,然后释放总线。写入0完成。 3.2 向DS18B20写1。 将总线由高拉低,低电平保持1-15us(看图三可知,低电平时间要低于15us),再释放总线。 图三 4.读取DS18B20寄存器中数据 4.1 读数据0 将总线由高拉低,保持1-15us。如果DS18B20中数据是0,则会将总线拉低。此时,总线上为低电平。我们要在60us以内读取数据(图四可知,60us以内DS18B20会释放总线)。否则可能会读到错误数据。 4.2 读数据1 将总线由高拉低,保持1-15us,如果数据是1,DS18B20会释放总线,总线上为高电平。然后在15us以后读取数据。 图四 5.DS18B20一些命令 5.1 0xCC→跳过ROM 5.2 其他命令 0x44→开始温度转换指令 ,0xBE→读取数据寄存器指令 图五 6.DS18B20数据寄存器 这里也比较关键,所以拎出来讲一下。 首先DS18B20的数据寄存器是16位,其中寄存器高字节的高5位的S表示符号位,其余3位才是表示数据。这里就浅讲一下,后面结合代码来解析一下。 图六 7.代码实例 声明:首先这里面的延时都是按照经验值,就是通过实践,得出比较准确的延时。 注:这里使用的是12M频率的单片机,如果是1M可以把for循环去掉 延时函数如下: sbit DQ=P1^4; //我这里是P1^4连接了DS18B20的数据线。 //你们根据自己的单片机原理图查询 void Delay_OneWire(unsigned int t) { unsigned char i; while(t--){ for(i=0;i= 1; //dat右移一位 } Delay_OneWire(5); }7.3 读取DS18B20数据寄存器的值 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; //循环8次,读一个字节 for(i=0;i>= 1; DQ = 1; //释放总线 if(DQ) // 因为dat>>1位默认是0 ,如果DQ为0,就不需要赋0了 { dat |= 0x80; //给dat赋1 } Delay_OneWire(5); } return dat; }7.4 读取温度 unsigned int get_temp() { unsigned int result; float i; unsigned char low,high; init_ds18b20(); Write_DS18B20(0xcc);//跳过rom Write_DS18B20(0x44);//开始转换 init_ds18b20(); Write_DS18B20(0xcc);//跳过rom Write_DS18B20(0xbe);//开始转换 low=Read_DS18B20(); //先读取低字节 high=Read_DS18B20();//再读取高字节 result =high&0x0f; //获取高字节低4位数据(1位符号位,3位数据位) result |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |